package com.springBoot.springBootSysCore.common.service;

import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;

/**
 * 默认提供的接口
 * @author timo
 * @param <T>
 */
public interface IBaseService<T, PK> {
	/**
	 * 根据Id查询
	 * @param id
	 * @return
	 */
	public T findById(PK id);
	/**
	 * 根据非空属性查询
	 * @param t
	 * @return
	 */
//	public T findOne(T t);
	/**
	 * 根据条件 单查询
	 * @return
	 */
	public T find(Specification<T> specification);
	/**
	 * 查询全部数据
	 * @return
	 */
	public List<T> findAll();
	/**
	 * 查询全部数据
	 * @return
	 */
	public List<T> findAll(Specification<T> specification);

	public List<T> findAll(Map<String, Object> param);
	/**
	 * 根据Id删除实体
	 * @param id
	 * @return 返回msg和flag
	 */
	public Map<String, Object> delete(PK id);
	/**
	 * 保存实体,返回MAP
	 * @param t
	 * @return
	 */
	public Map<String, Object> save(T t);
	/**
	 * 保存实,体返回实体
	 * @param t
	 * @return
	 */
	public T saveEntiey(T t);
	/**
	 * 分页查询
	 * @param request 参数
	 * @param pageable
	 * @return
	 */
	public Page<T> getPage(HttpServletRequest request,Pageable pageable);
	
	/**
	 * 分页查询 ——调用的下面分页的实现--参数都使用getSpecification进行封装
	 * @param andParams 参数
	 * @param pageable
	 * @return
	 */
	public Page<T> getPage(Map<String,Object> andParams,Pageable pageable);
	/**
	 * 分页查询
	 * @param andParams [and 连接的参数]
	 * @param orParam [or 连接的参数]
	 * @param pageable
	 * @return
	 */
	public Page<T> getPage(Map<String,Object> andParams,Map<String,Object> orParam,Pageable pageable);
	
	/**
	 * 分页查询
	 * @param specification
	 * @param pageable
	 * @return
	 */
	public Page<T> getPage(Specification<T> specification,Pageable pageable);
	/**
	 * 创建查询条件
	 * @param andParam [and 连接的参数]
	 * @param orParam [or 连接的参数]
	 * @return
	 */
	public Specification<T> getSpecification(Map<String, Object> andParam, Map<String, Object> orParam);


}
